/**
  ****************************(C) COPYRIGHT 2019 DJI****************************
  * @file       can_receive.c/h
  * @brief      这里是CAN中断接收函数，接收电机数据,CAN发送函数发送电机电流控制电机.
  * @note       
  * @history
  *  Version    Date            Author          Modification
  *  V1.0.0     Dec-26-2018     RM              1. done
  *  V1.1.0     Nov-11-2019     RM              1. support hal lib
  @verbatim
  ==============================================================================
  ==============================================================================
  @endverbatim
  ****************************(C) COPYRIGHT 2019 DJI****************************
  */

#ifndef CAN_RECEIVE_H
#define CAN_RECEIVE_H
#include "struct_typedef.h"
#include "main.h"

#define CHASSIS_CAN			hcan1
#define engineering_CAN hcan2

/* CAN send and receive ID */
//因为有重复的ID，这里不能再用typedef enum，要改成define
/***************CAN1*****************/
#define CAN_CHASSIS_ALL_ID			 0x200    //电机ID未更改，后续更改
#define CAN_chassis_3508_M1_ID   0x201
#define CAN_chassis_3508_M2_ID   0x202
#define CAN_chassis_3508_M3_ID   0x203
#define CAN_chassis_3508_M4_ID   0x204

#define CAN_GO_DOWN_ALL_ID       0x1FF
#define CAN_go_down_3508_M1_ID   0x205
#define CAN_go_down_3508_M2_ID	 0x206
#define CAN_rescue_IDcard_ID     0x207   //救援卡拾取电机 by yan fubing
/*****************CAN2***************/

#define CAN_obstacle_ALL_ID      0x200
#define CAN_obstacle_3508_M1_ID	 0x201
#define CAN_obstacle_3508_M2_ID	 0x202
#define CAN_rescue_3508_M1_ID		 0x203
#define CAN_rescue_3508_M2_ID		 0x204

#define CAN2_ID                  0x101   //A板自己的ID
#define CAN_receive_RC_ID        0x100   //接收云台A板的遥控数据
//rm motor data

typedef struct 
{
	int8_t x_speed;						  //X轴移动速度。范围：-100~+100
	int8_t y_speed;						  //y轴移动速度。范围：-100~+100
	int8_t z_speed;						  //z轴旋转速度。范围：-100~+100
    int8_t fall_down_speed;     //升降移动的速度
	uint8_t chassis_state_flag : 3;  //高三位对应底盘的六种状态，4，5位对应三种工作模式：救援，取矿，兑换
	uint8_t engineer_work_flg : 2;
	uint8_t cail_flag : 2;           //高两位,0x7F对应底盘救援校准，0xBF底盘校准
	uint16_t  key;           
}can2_receive_t;


typedef struct
{
    uint16_t ecd;
    int16_t speed_rpm;
    int16_t given_current;
    uint8_t temperate;
    int16_t last_ecd;
    int16_t  ecd_count;//电机轴圈数累积
} motor_measure_t;


/**
  * @brief          发送电机控制电流(0x201,0x202,0x203,0x203,0x205,0x206)   //by 颜福兵
  * @param[in]      engineer1: (0x201) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      engineer2: (0x202) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      engineer3: (0x203) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      engineer4: (0x204) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      engineer5: (0x205) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      engineer6: (0x206) 3508电机控制电流, 范围 [-16384,16384]
  * @retval         none
  */
extern void CAN_cmd_engineer(int16_t engineer1, int16_t engineer2, int16_t engineer3, int16_t engineer4, int16_t engineer5, int16_t engineer6);

/**
  * @brief          发送ID为0x700的CAN包,它会设置chassis 3508电机进入快速设置ID
  * @param[in]      none
  * @retval         none
  */
extern void CAN_cmd_chassis_reset_ID(void);

/**
  * @brief          发送底盘电机控制电流(0x201,0x202,0x203,0x204)
  * @param[in]      motor1: (0x201) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor2: (0x202) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor3: (0x203) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor4: (0x204) 3508电机控制电流, 范围 [-16384,16384]
  * @retval         none
  */
extern void CAN_cmd_chassis(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4);

/**
  * @brief          发送升降电机控制电流(0x205,0x206)
  * @param[in]      motor_1: (0x205) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_2: (0x206) 3508电机控制电流, 范围 [-16384,16384]
  * @retval         none
  */
extern void CAN_cmd_go_down(int16_t motor_1, int16_t motor_2,int16_t rescue_ID_Card);

/**
  * @brief          发送救援卡电机控制电流(0x205,0x206)
  * @param[in]      motor_1: (0x205) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_2: (0x206) 3508电机控制电流, 范围 [-16384,16384]
  * @retval         none
  */
extern void CAN_cmd_rescue_IDcard(int16_t motor_1);

/**
  * @brief          发送障碍快 救援电机控制电流(0x207,0x208)
  * @param[in]      motor_1: (0x207) 3508电机控制电流, 范围 [-16384,16384]
  * @param[in]      motor_2: (0x208) 3508电机控制电流, 范围 [-16384,16384]
					motor_3   (0x209)
					motor_4   (0x20a)
  * @retval         none
  */
extern void CAN_cmd_obstacle(int16_t motor_obstacle_1, int16_t motor_obstacle_2, int16_t motor_rescue_1, int16_t motor_rescue_2);
/**
  * @brief          底盘CAN2发送云台CAN2
  * @param[in]    
  * @param[in]     
  * @retval         none
  */
 void CAN2_Chassis_to_Gimbal(void);

/*************************************************************************/
/**
  * @brief          返回底盘电机 3508电机数据指针
  * @param[in]      i: 电机编号,范围[0,3]
  * @retval         电机数据指针
  */
extern const motor_measure_t *get_chassis_motor_measure_point(uint8_t i);
/**
  * @brief          返回升降电机 3508电机数据指针
  * @param[in]      i: 电机编号,范围[4，5]
  * @retval         电机数据指针
  */
extern const motor_measure_t* get_fall_down_motor_measure_point(uint8_t i);
/**
  * @brief          返回障碍块电机 3508电机数据指针
  * @param[in]      i: 电机编号,范围[0,1]
  * @retval         电机数据指针
  */
extern const motor_measure_t* get_obstacle_motor_measure_point(uint8_t i);
/**
  * @brief          返回救援电机数据指针 3508
  * @param[in]      i: 电机编码，范围[2，3]
  * @retval         电机数据指针
  */
extern const motor_measure_t* get_rescue_motor_measure_point(uint8_t i);

/**
  * @brief           返回云台A板发送的数据
  */
extern const motor_measure_t *get_rescue_IDcard_point(void);

/**
  * @brief           返回云台A板发送的数据
  */
extern const can2_receive_t *get_can_control_point(void);

#endif
